﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Datos.Entidades;
using Datos.Fabricas;
using Datos.Interfaces;
using System.Data.SqlClient;
using Datos.Entidades.FabricaEntidades;
using log4net;

namespace Datos.DAOSqlServer
{
    public class DAOSqlAccesoParticipante: IDAOAccesoParticipante
    {

        #region Logger
        private static readonly ILog log = LogManager.GetLogger(
        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);





        #endregion 
        
       IDAOAccesoConexion bd = FabricaConexion.DAOSqlServerAccesoConexion();

       public DAOSqlAccesoParticipante()
       {
           log.Info("Conexion DAOSqlAccesoParticipante");
       }


        /// <summary>
        /// Inserta una nuevo participante en la base de datos
        /// </summary>
        /// <param name="participante">Participante a insertar</param>
        /// <returns>Si la creación fue exitosa o no</returns>
        public bool InsertarParticipante(Entidad participante)
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[INSParticipante]";
               command.CommandTimeout = 10;
               command.Parameters.AddWithValue( "@Nombre",(participante as Participante).NombreParticipante);
               command.Parameters.AddWithValue( "@Categoria",(participante as Participante).Categoria );
     

               SqlDataReader reader = command.ExecuteReader();
               log.Info("Se genero la consulta");
               reader.Close();
               bd.CerrarConexionBd();
               return true;
           } catch ( SqlException )
           {
               log.Error("No se genero la consulta");
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               log.Error("Error en la aplicacion");
               bd.CerrarConexionBd();
               return false;
           }
       }

        /// <summary>
        /// Modificar un participante en la base de datos
        /// </summary>
        /// <param name="participante">Participante a modificar</param>
        /// <returns>Si la modicqacion fue exitosa o no</returns>
        public bool ModificarParticipante(Entidad participante)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UPDParticipante]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idParticipante", (participante as Participante).IdParticipante);
                command.Parameters.AddWithValue("@Nombre", (participante as Participante).NombreParticipante);
                command.Parameters.AddWithValue("@Categoria", (participante as Participante).Categoria);
                command.Parameters.AddWithValue("@Status", (participante as Participante).Status);


                SqlDataReader reader = command.ExecuteReader();
                log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return true;
            }
            catch (SqlException)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }


     /// <summary>
        /// Eliminar categoria en la base de datos
        /// </summary>
        /// <param name="categoria">ID Categoria a eliminar</param>
        /// <returns>Si la eliminacion fue exitosa o no</returns>
        public bool EliminarParticipante(int idParticipante)
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[DELParticipante]";
               command.CommandTimeout = 10;

               command.Parameters.AddWithValue( "@IdParticipante",idParticipante);
              
               SqlDataReader reader = command.ExecuteReader();
               log.Info("Se genero la consulta");
               reader.Close();
               bd.CerrarConexionBd();
               return true;
           } catch ( SqlException )
           {
               log.Error("Error en la consulta");
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               log.Error("Error en la aplicacion");
               bd.CerrarConexionBd();
               return false;
           }
       }

        public List<Entidad> ObtenerParticipante()
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELFParticipante]";
                command.CommandTimeout = 10;

                List <Entidad> listaParticipante=new List<Entidad>();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Entidad participante = FabricaEntidades.ObtenerParticipante();
                    (participante as Participante).IdParticipante = (reader.GetInt32(0));
                    (participante as Participante).NombreParticipante= (reader["Nombre"] as String);
                    (participante as Participante).Categoria = (reader.GetInt32(2));
                    (participante as Participante).Status = (reader.GetInt32(3));
                    (participante as Participante).Categoria1 = (reader["NombreCategoria"] as String);

                    listaParticipante.Add((participante as Participante));
                }
                log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return listaParticipante;
            }
            catch (SqlException)
            {
                log.Error("no se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
              
                bd.CerrarConexionBd();
                return null;
            }
        }


        public Entidad BuscarParticipante(int idParticipante)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELParticipante]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idParticipante", idParticipante);
                SqlDataReader reader = command.ExecuteReader();
                Entidad participante = FabricaEntidades.ObtenerParticipante();
                while (reader.Read())
                {
                    
                    (participante as Participante).IdParticipante = (reader.GetInt32(0));
                    (participante as Participante).NombreParticipante = (reader["Nombre"] as String);
                    (participante as Participante).Categoria = (reader.GetInt32(2));
                    (participante as Participante).Status = (reader.GetInt32(3));
                }log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return participante;
            
            }
            catch (SqlException)
            {
                log.Error("no se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
              
                bd.CerrarConexionBd();
                return null;
            }
        }
    }
   

}

